Paradigm(s) | multiparadigm, procedural, object-oriented, high-level, domain-specific |
---|---|
Appeared in | June 1995 |
Designed by | Kent Tessman |
Developer | The General Coffee Company Film Productions |
Stable release | 3.1.03 (January 10, 2006 | )
Implementation language | C |
Platform | Acorn, Macintosh, Palm, PC, Pocket PC, Psion |
OS | Cross-platform: Amiga, BeOS, DOS, OS/2, Palm, EPOC, RISC OS, Unix (Linux, Macintosh), Windows, Windows Mobile[1] |
License | Freeware |
Website | www.generalcoffee.com |
Hugo is a programming language and design system for interactive fiction created by Kent Tessman. While not as popular as Inform or TADS, it is still used, particularly for multimedia interactive fiction (as opposed to strict text adventures).
Contents |
The Hugo language is a hybrid of several features to provide a command processing system. The system consists of a verb definition section, a property and attribute definition section, an object definition section, and a code section. One may assign multiple names to the same attribute or property through the alias parameter to an attribute or property.
The language is not case sensitive, although much of the code base in the standard library uses camel case for identifiers. Identifiers must start with a letter, and may contain letters, numbers and underscores. Strings are defined by using a double quote. Where it is necessary to include a double quote in a string, it may be escaped by preceding it with a backslash, i.e. \" . With the exception of quoted strings, lines must be explicitly marked as being continued by having the last character on the line to be a backslash.
The system provides for procedures, called a "routine" which may optionally return a value. All executable statements must be within a routine, there is no "default" mode to execute code outside of a routine. Comments may be specified anywhere that white space is acceptable, and are indicated by an exclamation point !. This causes anything remaining on the line from that point to be ignored. A special type of block comment for commenting a large area may be used by having the first two characters on a line begin with the comment !\ and the block comment is closed by the next occurrence of the inverse string \! .
Where a "block" is needed - a set of related values or a particular piece of executable code - it is indicated by encasing it in the open brace character { and closing it with the }, similar to the same functionality in the C language. As with a number of other programming language, Hugo borrows from C for a number of features, including "escaping" some values by preceding them with a backslash, the use of the ++ symbol to increment a variable, and the { and } braces for block begin and block end, as noted earlier. Hugo borrows the use of the "print" command for displaying variables and the use of the semi-colon ( ; ) from the Basic programming language to indicate output that is not to be broken by a new line.
There are two mandatory routines, one named "init" and one named "main." Init is run once when the program starts, and as the name implies, initializes anything the system needs to do. After Init ends, the routine "main" is run on every turn, a "turn" being used in the sense that each command issued by the player is a new turn. The main routine is used to do the typical housekeeping on each turn. The user is prompted for input, the parser processes the input to translate it into a verb and options to the verb, then determine the routine that processes that verb. The routine then returns a set of responses to the verb and options (if any), and the user is then prompted to type in a command.
The system requests commands and continues to do so until a routine indicates the program is over. Since the system was originally designed for writing of games, the determination of the program being over is typically because either because the player "won" according to the rules for that game, or because the player "lost".
In the verb definition section, one begins by defining each command, known as a "verb" in which the code defines the verb as a quoted string. One then lists, one line at a time, each of the parameters to be used for processing the command issued. For example, if one has a command of "incinerate" one would define a verb such as
verb "incinerate" * DoIncinerate * object DoIncinerate * "me" DoSuicide
Where the first parameter means that, if the user running the program types the command "incinerate" with no options, it runs the routine "DoIncinerate". If the user types the command "incinerate" and names a defined object, the DoIncinerate routine is run with the default object (whose name is 'object') being assigned the value of whatever object the user selected. If the user types the command "incinerate" followed by the option "me" then the DoSuicide routine is run.
The system allows for up to 128 different attributes to be defined. Attributes are true/false values that represent conditions of an object. All attributes defined in a program are available to any object. For example, if an attribute of an object was hot or cold, one could define an attribute for one or the other, then use "not" preceding an attribute to test for the opposite condition. Attributes are defined by the attribute command and the name of the attribute, such as:
</syntaxhighlight lang="c"> Attribute wet attribute female attribute cold attribute hard </syntaxhighlight>
One defines an attribute as being possessed by an object by the is command, followed by the name of the attribute. To explicitly state that the attribute is not possessed, one indicated by placing "not" before the attribute on the is command.
Properties can contain essentially any value desired, including other objects. While every object contains all defined attributes, an object only contains the properties assigned to it when it is defined. A property may be defined either with or without a value, and is defined by the property command, the name of the property, and the optional value, such as
property color property weight 30 property size 4 property comment "whoa"
Every thing that can be manipulated in a Hugo program is an object. Objects have attributes and properties. All defined attributes are available to all objects, but each object only has the properties assigned to it when it is created. An object is a block of specifications stating all of the information about it, begins with the object command, the name of the object, an optional descriptive string for the name, a block open symbol (the open brace ( ) the various values to assign to the object, and a block close symbol (the close brace } ). In the following object
object table "Kitchen Table" { is hard is not female color brown size 10 }
The "table" object would have the hard attribute (set to true) and would have the cold, female and wet attributes, which are all false. The object would have been set to "is not female" by default, but explicitly specifying it may be useful, or if the object is a copy of another object but with additional or different properties or differing values for the attributes. The color property of the table object could be referenced through "table.color".
All action in a Hugo program takes place in a routine. In the example given above, if the user had typed "Incinerate me" the DoSuicide routine would have been executed:
routine DoSuicide { "I can't allow you to do this,"; print player.name;"." }
A quoted string by itself is treated as an implicit print statement. To print actual values such as the name property (one of about six properties automatically defined by the compiler) it is necessary to specify it through the print command, by specifying the name of the object and the property, separated by the dot ( . ) operator. To reference an attribute, it may be tested in an if statement, like so:
if (table is cold) { ... other code ... } else { if (table is not hard) { ... other code ... } }
The Hugo language also provides for classes, which are more like types of objects than full classes as used in object oriented programming (classes do not have direct methods in Hugo). A property may be a value, an array, or it may represent executable code such as an equivalent to a method in a full object oriented language.